package io.mft.commons.util;


import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import io.mft.commons.function.response.kv.KVMap;
import io.mft.commons.function.response.kv.PageObject;
/**
 * 分页数据处理，从第一页数据处理到最后一页数据
 * @类型名称：PageProcessor
 * @说明：TODO
 * @创建者: 胡常建  
 * @创建时间: 2015年10月18日 下午1:20:37
 * @修改者: 胡常建  
 * @修改时间: 2015年10月18日 下午1:20:37
 */
public class PageProcessor {
	static Logger logger=LoggerFactory.getLogger(PageProcessor.class);
	/**
	 * 分页查询
	 * @类型名称：PagerQuery
	 * @说明：TODO
	 * @创建者: 胡常建  
	 * @创建时间: 2015年10月18日 下午1:28:35
	 * @修改者: 胡常建  
	 * @修改时间: 2015年10月18日 下午1:28:35
	 */
	public interface PagerQuery{
		PageObject<KVMap> query(int page,Object...args);
	}
	/**
	 * 数据处理
	 * @类型名称：DataHandler
	 * @说明：TODO
	 * @创建者: 胡常建  
	 * @创建时间: 2015年10月18日 下午1:28:23
	 * @修改者: 胡常建  
	 * @修改时间: 2015年10月18日 下午1:28:23
	 */
	public	interface DataHandler{
		/**
		 * 返回状态用于控制是否继续循环迭代分页，如果 true  继续循环分页查询 否则终止分页查询
		 * @方法名称: handle
		 * @参数 @param page
		 * @参数 @param dataList
		 * @参数 @param args
		 * @参数 @return
		 * @说明: TODO
		 * @返回类型 boolean    
		 * @创建者: 胡常建  
		 * @创建时间: 2018年5月31日 上午9:41:59
		 * @修改者: 胡常建  
		 * @修改时间: 2018年5月31日 上午9:41:59
		 */
		boolean handle(int page,List<KVMap> dataList,Object...args);
	}
	private PagerQuery pagerQuery;
	private DataHandler handler;
	public PageProcessor(PagerQuery pagerQuery,DataHandler handler){
		this.pagerQuery=pagerQuery;
		this.handler=handler;
	}
	@SuppressWarnings("unchecked")
	public boolean process(Object...args){
		int i=0;
		boolean s=true;
		while (true) {
			try {
				i++;
				PageObject<KVMap> page=this.pagerQuery.query(i,args);
				List<KVMap> dataList=page.getList();
				s=handler.handle(i,dataList,args);
				if (!s) {
					break;
				}
				if(i>=page.getTotalPage()) {
					break;
				}
			} catch (Exception e) {
				logger.error("", e);
				break;
			}
		}
		return s;
	}
	
}
